/*!
 * \file WtRunner.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader运行器类定义文件
 *		  本文件定义了WtRunner运行器类，负责整个交易系统的初始化、配置和运行
 *		  集成了CTA、HFT、SEL三种交易引擎，支持多种策略类型
 *		  提供完整的系统生命周期管理，包括数据管理、行情解析、交易适配等
 *		  实现了统一的日志处理接口，为交易系统提供核心运行框架
 */
#pragma once
#include <string>
#include <unordered_map>

#include "../Includes/ILogHandler.h"

#include "../WtCore/EventNotifier.h"
#include "../WtCore/CtaStrategyMgr.h"
#include "../WtCore/HftStrategyMgr.h"
#include "../WtCore/SelStrategyMgr.h"

#include "../WtCore/WtCtaEngine.h"
#include "../WtCore/WtHftEngine.h"
#include "../WtCore/WtSelEngine.h"
#include "../WtCore/WtLocalExecuter.h"
#include "../WtCore/WtDistExecuter.h"
#include "../WtCore/TraderAdapter.h"
#include "../WtCore/ParserAdapter.h"
#include "../WtCore/WtDtMgr.h"
#include "../WtCore/ActionPolicyMgr.h"

#include "../WTSTools/WTSHotMgr.h"
#include "../WTSTools/WTSBaseDataMgr.h"

NS_WTP_BEGIN
class WTSVariant;
class WtDataStorage;
NS_WTP_END

USING_NS_WTP;

/**
 * @class WtRunner
 * @brief WonderTrader运行器类
 * @details WonderTrader系统的核心运行器，负责整个交易系统的生命周期管理
 *          主要功能包括：
 *          1. 系统初始化 - 初始化日志、配置、基础数据等
 *          2. 引擎管理 - 支持CTA、HFT、SEL三种交易引擎
 *          3. 组件集成 - 集成行情解析器、交易适配器、执行器等
 *          4. 策略管理 - 加载和管理各种交易策略
 *          5. 数据管理 - 管理历史数据和实时数据
 *          6. 事件通知 - 处理系统事件和日志
 *          
 *          支持的交易模式：
 *          - CTA模式：商品期货趋势跟踪策略
 *          - HFT模式：高频交易策略
 *          - SEL模式：选股策略
 *          
 *          实现ILogHandler接口，提供统一的日志处理能力
 */
class WtRunner : public ILogHandler
{
public:
	/**
	 * @brief 构造函数
	 * @details 初始化WtRunner实例，设置默认状态
	 *          安装信号处理钩子（Unix系统）
	 *          初始化成员变量为默认值
	 */
	WtRunner();
	
	/**
	 * @brief 析构函数
	 * @details 清理WtRunner资源
	 *          释放相关内存和资源
	 */
	~WtRunner();

public:
	/**
	 * @brief 初始化系统
	 * @return 成功返回true，失败返回false
	 * @details 执行系统基础初始化操作：
	 *          1. 初始化日志系统（logcfg.json/yaml）
	 *          2. 设置程序安装目录
	 *          3. 准备系统运行环境
	 */
	bool init();

	/**
	 * @brief 配置系统
	 * @return 成功返回true，失败返回false
	 * @details 加载和配置系统各个组件：
	 *          1. 加载主配置文件（config.json/yaml）
	 *          2. 初始化基础数据（交易时段、品种、合约、节假日等）
	 *          3. 初始化交易引擎（CTA/HFT/SEL）
	 *          4. 初始化数据管理器
	 *          5. 初始化行情解析器
	 *          6. 初始化交易适配器
	 *          7. 初始化执行器（非HFT模式）
	 *          8. 初始化交易策略
	 */
	bool config();

	/**
	 * @brief 运行系统
	 * @param bAsync 是否异步运行，默认为false
	 * @details 启动整个交易系统：
	 *          1. 启动行情解析器
	 *          2. 启动交易适配器
	 *          3. 启动交易引擎
	 *          如果bAsync为true，则异步运行；否则阻塞运行
	 */
	void run(bool bAsync = false);

private:
	/**
	 * @brief 初始化交易适配器
	 * @param cfgTrader 交易适配器配置
	 * @return 成功返回true，失败返回false
	 * @details 根据配置初始化所有交易适配器
	 *          支持多个交易通道的并行管理
	 */
	bool initTraders(WTSVariant* cfgTrader);
	
	/**
	 * @brief 初始化行情解析器
	 * @param cfgParser 行情解析器配置
	 * @return 成功返回true，失败返回false
	 * @details 根据配置初始化所有行情解析器
	 *          支持多个行情源的并行接入
	 */
	bool initParsers(WTSVariant* cfgParser);
	
	/**
	 * @brief 初始化执行器
	 * @param cfgExecuter 执行器配置
	 * @return 成功返回true，失败返回false
	 * @details 初始化本地和分布式执行器
	 *          仅在非HFT模式下使用
	 */
	bool initExecuters(WTSVariant* cfgExecuter);
	
	/**
	 * @brief 初始化数据管理器
	 * @return 成功返回true，失败返回false
	 * @details 初始化数据管理器，配置数据源
	 *          管理历史数据和实时数据
	 */
	bool initDataMgr();
	
	/**
	 * @brief 初始化事件通知器
	 * @return 成功返回true，失败返回false
	 * @details 初始化事件通知系统
	 *          配置事件回调和通知机制
	 */
	bool initEvtNotifier();
	
	/**
	 * @brief 初始化CTA策略
	 * @return 成功返回true，失败返回false
	 * @details 加载和初始化所有CTA策略
	 *          创建策略上下文并绑定到引擎
	 */
	bool initCtaStrategies();
	
	/**
	 * @brief 初始化HFT策略
	 * @return 成功返回true，失败返回false
	 * @details 加载和初始化所有HFT策略
	 *          创建策略上下文并绑定到引擎和交易适配器
	 */
	bool initHftStrategies();
	
	/**
	 * @brief 初始化动作策略
	 * @return 成功返回true，失败返回false
	 * @details 初始化买卖动作策略管理器
	 *          配置交易动作规则
	 */
	bool initActionPolicy();

	/**
	 * @brief 初始化交易引擎
	 * @return 成功返回true，失败返回false
	 * @details 根据配置选择并初始化对应的交易引擎：
	 *          - CTA引擎：商品期货趋势跟踪
	 *          - HFT引擎：高频交易
	 *          - SEL引擎：选股策略
	 */
	bool initEngine();

//////////////////////////////////////////////////////////////////////////
//ILogHandler
public:
	/**
	 * @brief 处理日志追加
	 * @param ll 日志级别
	 * @param msg 日志消息
	 * @details 实现ILogHandler接口，处理系统日志
	 *          将日志转发给事件通知器
	 */
	virtual void handleLogAppend(WTSLogLevel ll, const char* msg) override;

private:
	WTSVariant*			_config;		///< 系统配置对象
	TraderAdapterMgr	_traders;		///< 交易适配器管理器
	ParserAdapterMgr	_parsers;		///< 行情解析器管理器
	WtExecuterFactory	_exe_factory;	///< 执行器工厂

	WtCtaEngine			_cta_engine;	///< CTA交易引擎
	WtHftEngine			_hft_engine;	///< HFT交易引擎
	WtSelEngine			_sel_engine;	///< SEL交易引擎
	WtEngine*			_engine;		///< 当前使用的交易引擎指针

	WtDataStorage*		_data_store;	///< 数据存储对象

	WtDtMgr				_data_mgr;		///< 数据管理器

	WTSBaseDataMgr		_bd_mgr;		///< 基础数据管理器
	WTSHotMgr			_hot_mgr;		///< 主力合约管理器
	EventNotifier		_notifier;		///< 事件通知器

	CtaStrategyMgr		_cta_stra_mgr;	///< CTA策略管理器
	HftStrategyMgr		_hft_stra_mgr;	///< HFT策略管理器
	SelStrategyMgr		_sel_stra_mgr;	///< SEL策略管理器
	ActionPolicyMgr		_act_policy;	///< 动作策略管理器

	bool				_is_hft;		///< 是否为HFT模式
	bool				_is_sel;		///< 是否为SEL模式
};

